Análisis de Radiación solar, Dirección del viento y Velocidad del viento stación Compartir

Análisis de Radiación solar, Dirección del viento y Velocidad del viento stación Compartir#




Importación de Librerías

# Load libraries
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Load sklearn
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error

import warnings
warnings.filterwarnings("ignore")

A continuación usamos la función read_cvs() de la libreria pandaspara cargar los datos a nuestro entorno de trabajo.

df = pd.read_csv("data_2017_2022.csv", sep=";")
df_1 = df.copy()
df_1["medicion"]=df_1["medicion"].str.replace(",", ".").astype("float") # convertir variable medición a númerica
df_1['fecha'] = pd.to_datetime(df_1['fecha']) # convertir variable fecha a datatime
df_1 = df_1.pivot(index=["fecha", "estacion"],columns= "variable", values="medicion").reset_index()

Para más practicidad se renombran las variables de nuestro conjunto de datos.

df_1 = df_1.rename(columns={    
    'variable': 'var',
    'black_carbon': 'BC',
    'direccion_viento': 'WD',
    'humedad': 'HR',
    'lluvia': 'RF',
    'presion': 'P',
    'radiacion_solar': 'RS',
    'temperatura': 'AT',
    'temperatura_10_m': 'AT_10_m',
    'uv-pm': 'UV',
    'velocidad_viento': 'WS',
    'h2s': 'H2S',
    'no2': 'NO2',
    'o3': 'O3',
    'so2': 'SO2',
    'pm10': 'PM10',
    'pm25': 'PM2.5'  
})

Dado que la variable la variable \(\text{NO}_2\) tiene solo \(1\) medición entre \(473.256\) registros durante el periodo analizado, lo que representa casi un \(100\%\) de datos faltantes, hemos optado por excluirla del análisis.

df_t = df_1.copy()
df_t = df_t.drop(columns=["NO2"])
df_compartir = df_t[df_t['estacion'] == 'compartir']

Radiación Solar (RS) #

import plotly.graph_objects as go
import pandas as pd

fig = go.Figure()

# Añadir la traza de la línea
fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['RS'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F'),  # Cambiar el color de la línea
    name='Radiación Solar',
    opacity=0.7
))

# Ajustar el diseño del gráfico
fig.update_layout(
    title='Radiación Solar (W/m2) a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='Radiación Solar (W/m2)',  
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'), 
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco para mejorar la visualización
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)


fig.show()
import plotly.express as px
import plotly.graph_objects as go


fig_density = px.histogram(df_compartir, x="RS", marginal="box", nbins=50, title="Densidad de Radiación Solar (W/m2)  Estación Compartir",
                           labels={'RS': 'Radiación Solar (W/m2)'}, color_discrete_sequence=['#30143F'],
    opacity=0.7)


fig_density.update_layout(
    xaxis_title="Radiación Solar (W/m2)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go
import pandas as pd

# Crear la columna 'Año' basada en 'fecha'
df_compartir['Año'] = df_compartir['fecha'].dt.year

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902']  

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['RF'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Radiación Solar (W/m2) por Año",
    xaxis_title="Año",
    yaxis_title="Radiación Solar (W/m2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir[df_compartir['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['RF'],
        name=mes,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Radiación Solar Mensual",
    xaxis_title="Mes",
    yaxis_title="Radiación Solar (W/m2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  
        ticktext=orden_meses,  
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir[df_compartir['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['RF'],
        name=dia,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Radiación Solar por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Radiación Solar (W/m2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,  # Asegurar que todos los días se muestran en el orden correcto
        ticktext=orden_dias,  # Etiquetas para cada día en el orden correcto
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']

# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir[df_compartir['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['RF'],
        name=hora,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Radiación Solar por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Radiación Solar (W/m2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,  # Asegurar que todas las horas se muestran en el orden correcto
        ticktext=orden_horas,  # Etiquetas para cada hora en el orden correcto
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)


figbox.show()

En los gráficos analizados, se observa que los niveles más altos de radiación solar (medidos en \(m/s^2\)) se registraron en 2017, mientras que los niveles más bajos ocurrieron en 2020. Este patrón puede estar influenciado por variaciones climáticas o eventos atmosféricos específicos de esos años.

En cuanto a la distribución mensual, los meses de marzo, abril, mayo, septiembre, noviembre y diciembre presentan los niveles más altos de radiación solar. Esto podría estar relacionado con la posición del sol y la duración del día durante estos meses, que suelen coincidir con las estaciones de primavera y otoño en muchas regiones, donde la radiación solar es más intensa.

Al examinar las horas del día, se detecta una disminución en los niveles de radiación solar entre las 9 a.m. y el mediodía. Este fenómeno puede deberse a varios factores, como la presencia de nubes matutinas que se disipan más tarde en el día, o la inclinación del sol que afecta la intensidad de la radiación recibida en la superficie. Además, de la actividad humana, como la contaminación del aire, puede impactar la transmisión de la radiación solar.

Dirección del Viento (WD) #

import plotly.graph_objects as go
import pandas as pd


fig = go.Figure()


fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['WD'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F'),  # Cambiar el color de la línea
    name='Dirección del viento (°)',
    opacity=0.7
))


fig.update_layout(
    title='Dirección del viento a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='Dirección del viento (°)',
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),  # Rotar etiquetas del eje X y formato de fecha
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco para mejorar la visualización
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)


fig.show()
import plotly.express as px
import plotly.graph_objects as go


fig_density = px.histogram(df_compartir, x="WD", marginal="box", nbins=50, title="Densidad de Dirección del viento (°) Estación Compartir",
                           labels={'WD': 'Dirección del viento (°)'}, color_discrete_sequence=['#30143F'],opacity=0.7)


fig_density.update_layout(
    xaxis_title="Dirección del viento (°)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go
import pandas as pd

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902'] 


figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['WD'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Dirección del viento (°) por Año",
    xaxis_title="Año",
    yaxis_title="Dirección del viento (°)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir[df_compartir['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['WD'],
        name=mes,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Dirección del viento Mensual",
    xaxis_title="Mes",
    yaxis_title="Dirección del viento (°)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  
        ticktext=orden_meses,  # Etiquetas para cada mes en el orden correcto
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)

# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)


figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir[df_compartir['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['WD'],
        name=dia,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Dirección del viento por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Dirección del viento (°)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias, 
        ticktext=orden_dias,  
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']


# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir[df_compartir['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['WD'],
        name=hora,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Dirección del viento por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Dirección del viento (°)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,
        ticktext=orden_horas,  # Etiquetas para cada hora en el orden correcto
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)

# Mostrar el gráfico interactivo
figbox.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la dirección del viento (°) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica que entre las 3 p.m. y 6 p.m., la mediana de dirección del viento muestra un cambio en la dirección leve comparado con otras horas, con una mayor dispersión en los datos en toda la franja horaria.

A continuación, realizaremos un análisis exhaustivo del comportamiento de la Dirección del viento en relación con su origen geográfico, tomando como punto de referencia la ubicación de la ciudad de Cali. Para facilitar este análisis, hemos establecido una serie de intervalos precisos que corresponden a las principales direcciones cardinales e intermedias. Estos intervalos se definen de la siguiente manera:

  • Norte (N): 337.5° - 22.5°

  • Nororiente (NE): 22.5° - 67.5°

  • Oriente (E): 67.5° - 112.5°

  • Suroriente (SE): 112.5° - 157.5°

  • Sur (S): 157.5° - 202.5°

  • Suroccidente (SO): 202.5° - 247.5°

  • Occidente (O): 247.5° - 292.5°

  • Noroccidente (NO): 292.5° - 337.5°

La implementación de estos intervalos nos permitirá:

  • Clasificar con precisión las direcciones del viento registradas en nuestros datos.

  • Comprender en profundidad los patrones de rotación del viento a lo largo del tiempo.

  • Interpretar de manera más intuitiva las tendencias y variaciones en la dirección del viento.

  • Relacionar la dirección del viento con otros factores meteorológicos y geográficos relevantes para Cali.

import pandas as pd
import numpy as np

# Ajustar los intervalos de dirección del viento
bins_wd = [-0.001, 22.5, 67.5, 112.5, 157.5, 202.5, 247.5, 292.5, 337.5, 360.001]
labels_wd = ['Norte (N)', 'Nororiente (NE)', 'Oriente (E)', 'Suroriente (SE)', 
             'Sur (S)', 'Suroccidente (SO)', 'Occidente (O)', 'Noroccidente (NO)', 'Norte (N)']

# 'WD' es una columna numérica con las direcciones del viento en grados
df_compartir['WD'] = pd.to_numeric(df_compartir['WD'], errors='coerce')

# Crear la nueva columna 'WD_GEO' con las categorías basadas en los intervalos
df_compartir['WD_GEO'] = pd.cut(df_compartir['WD'], bins=bins_wd, labels=labels_wd, right=False, include_lowest=True, ordered=False)

# Definir las categorías en el orden correcto y convertir 'WD_GEO' a tipo categórico ordenado
orden_categorias = ['Norte (N)', 'Nororiente (NE)', 'Oriente (E)', 'Suroriente (SE)', 
                    'Sur (S)', 'Suroccidente (SO)', 'Occidente (O)', 'Noroccidente (NO)']

df_compartir['WD_GEO'] = pd.Categorical(df_compartir['WD_GEO'], categories=orden_categorias, ordered=True)
import plotly.express as px
import plotly.graph_objects as go


fig_density = px.histogram(df_compartir, x="WD_GEO", nbins=50, title="Distribución de Dirección del viento (°) Estación Compartir",
                           labels={'WD_GEO': 'Dirección del viento (°)'}, color_discrete_sequence=['#30143F'],opacity=0.7)


fig_density.update_layout(
    xaxis_title="Dirección del viento (°)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go


# Crear una columna adicional para el año basado en la fecha
df_compartir['Año'] = df_compartir['fecha'].dt.year

# Contar el número de ocurrencias de cada categoría de intensidad por año
df_count = df_compartir.groupby(['Año', 'WD_GEO']).size().reset_index(name='Conteo')


# Crear una figura usando plotly.graph_objects
figbar = go.Figure()

# Definir colores para las categorías de dirección del viento
colores_wd = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902']

# Añadir trazas manualmente para cada categoría de dirección del viento
for i, label in enumerate(labels_wd):
    figbar.add_trace(go.Bar(
        x=df_count[df_count['WD_GEO'] == label]['Año'],
        y=df_count[df_count['WD_GEO'] == label]['Conteo'],
        name=label,
        marker_color=colores_wd[i % len(colores_wd)]  # Asignar un color específico a cada categoría
    ))

# Actualizar el diseño del gráfico
figbar.update_layout(
    title="Distribución de la Dirección del Viento por Año",
    xaxis_title="Año",
    yaxis_title="Número de Observaciones",
    barmode='group',  # Mostrar barras al lado una de la otra
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='linear'  # Asegurar que los ticks en el eje x son lineales para mejor visualización
    )
)


figbar.show()
import pandas as pd
import plotly.graph_objects as go

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', 
                 '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


# Crear columnas adicionales para el mes y el número del mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)
df_compartir['Mes_Num'] = df_compartir['fecha'].dt.month

# Contar el número de ocurrencias de cada categoría de dirección del viento por mes
df_count = df_compartir.groupby(['Mes', 'WD_GEO']).size().reset_index(name='Conteo')

# Asegurarse de que los meses estén en el orden correcto
df_count['Mes'] = pd.Categorical(df_count['Mes'], categories=orden_meses, ordered=True)
df_count = df_count.sort_values('Mes')


figbox = go.Figure()

# Añadir trazas para cada categoría de dirección del viento
for i, label in enumerate(df_count['WD_GEO'].unique()):
    df_subset = df_count[df_count['WD_GEO'] == label]
    figbox.add_trace(go.Bar(
        x=df_subset['Mes'],
        y=df_subset['Conteo'],
        name=label,
        marker_color=colores_meses[i % len(colores_meses)]  # Asignar un color específico a cada categoría
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de la Dirección del Viento Mensual",
    xaxis_title="Mes",
    yaxis_title="Número de Observaciones",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  
        ticktext=orden_meses,  
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    ),
    template='plotly_white'  # Fondo blanco para mejorar la visualización
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)

# Agrupar por día de la semana y categoría de dirección del viento y contar ocurrencias
df_semanal = df_compartir.groupby(['Día', 'WD_GEO']).size().reset_index(name='Conteo')

# Asegurarse de que los días de la semana estén en el orden correcto
df_semanal['Día'] = pd.Categorical(df_semanal['Día'], categories=orden_dias, ordered=True)
df_semanal = df_semanal.sort_values('Día')

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir la traza de barras para cada categoría de dirección del viento
for i, categoria in enumerate(df_semanal['WD_GEO'].unique()):
    df_categoria = df_semanal[df_semanal['WD_GEO'] == categoria]
    figbox.add_trace(go.Bar(
        x=df_categoria['Día'],
        y=df_categoria['Conteo'],
        name=categoria,
        marker_color=colores_dias[i % len(colores_dias)]  # Asignar un color específico a cada categoría
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de la Dirección del Viento por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Número de Observaciones",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,
        ticktext=orden_dias, 
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    ),
    barmode='group',  # Mostrar barras al lado una de la otra
    template='plotly_white'  # Fondo blanco
)

figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f'{i:02d}:00' for i in range(24)]

# Crear un diccionario para mapear horas a números
hora_a_numero = {hora: i for i, hora in enumerate(orden_horas)}

# Definir una lista de colores para las horas del día (si se requieren más colores, ajusta la lista)
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f',
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902',
                 '#e69c24', '#d98e31', '#c67e3f', '#a86e4f', '#8f615c', '#734764', '#5a3b59',
                 '#432c4d', '#30143F']

# Crear una columna adicional para la hora del día basado en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f'{x:02d}:00')

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(hora_a_numero)

# Agrupar por hora del día y categoría de dirección del viento y contar ocurrencias
df_horario = df_compartir.groupby(['Hora', 'WD_GEO']).size().reset_index(name='Conteo')

# Asegurarse de que las horas estén en el orden correcto
df_horario['Hora'] = pd.Categorical(df_horario['Hora'], categories=orden_horas, ordered=True)
df_horario = df_horario.sort_values('Hora')

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir la traza de barras para cada categoría de dirección del viento
for i, categoria in enumerate(df_horario['WD_GEO'].unique()):
    df_categoria = df_horario[df_horario['WD_GEO'] == categoria]
    figbox.add_trace(go.Bar(
        x=df_categoria['Hora'],
        y=df_categoria['Conteo'],
        name=categoria,
        marker_color=colores_horas[i % len(colores_horas)]  # Asignar un color específico a cada categoría
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de la Dirección del Viento por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Número de Observaciones",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,  # Asegurar que todas las horas se muestran en el orden correcto
        ticktext=orden_horas,  # Etiquetas para cada hora en el orden correcto
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas del día
    ),
    barmode='group',  # Mostrar barras al lado una de la otra
    template='plotly_white'  # Fondo blanco para mejorar la visualización
)

# Mostrar el gráfico interactivo
figbox.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la dirección del viento (en grados) cuando se segmentan los datos por año, mes y día de la semana. Sin embargo, al examinar los datos por horas del día, se identifica que la dirección predominante del viento proviene con mayor frecuencia del occidente, suroccidente, oriente y norte de Cali.

Velocidad del Viento (WS) #

import plotly.graph_objects as go
import pandas as pd

fig = go.Figure()

# Añadir la traza de la línea
fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['WS'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F'),  # Cambiar el color de la línea
    name='Velocidad del viento (m/s2)',
    opacity=0.7
))


fig.update_layout(
    title='Velocidad del viento del viento a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='Velocidad del viento (m/s2)',  
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),  # Rotar etiquetas del eje X y formato de fecha
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco para mejorar la visualización
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)


fig.show()
import plotly.express as px
import plotly.graph_objects as go


fig_density = px.histogram(df_compartir, x="WS", marginal="box", nbins=50, title="Densidad de Velocidad del viento (m/s2)Estación Compartir",
                           labels={'WS': 'Velocidad del viento (m/s2)'}, color_discrete_sequence=['#30143F'],opacity=0.7)

# Ajustar el diseño del gráfico de densidad
fig_density.update_layout(
    xaxis_title="Velocidad del viento (m/s2)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go
import pandas as pd

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902'] 

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['WS'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Velocidad del viento por Año",
    xaxis_title="Año",
    yaxis_title="Velocidad del viento (m/s2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)

# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)


figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir[df_compartir['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['WS'],
        name=mes,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Velocidad del viento Mensual",
    xaxis_title="Mes",
    yaxis_title="Velocidad del viento (m/s2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  # Asegurar que todos los meses se muestran en el orden correcto
        ticktext=orden_meses,  # Etiquetas para cada mes en el orden correcto
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']

# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir[df_compartir['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['WS'],
        name=dia,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Velocidad del viento por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Velocidad del viento (m/s2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,  # Asegurar que todos los días se muestran en el orden correcto
        ticktext=orden_dias,  # Etiquetas para cada día en el orden correcto
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)

figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']


# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir[df_compartir['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['WS'],
        name=hora,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Velocidad del viento por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Velocidad del viento (m/s2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,  # Asegurar que todas las horas se muestran en el orden correcto
        ticktext=orden_horas,  # Etiquetas para cada hora en el orden correcto
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)


figbox.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la velocidad del viento (\(m/s^2\)) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica que entre las 12 m. y 4 p.m., la mediana de velocidad del viento muestra un incremento comparado con otras horas, con una mayor dispersión en los datos entre las 4 p.m y 5 p.m. A partir de las 6 p.m., la velocidad del viento muestra una leve disminución hasta las 10 p.m., posterior a ésta hora la velocidad del viento se mantiene relativamente constantes hasta aproximadamente las 7 a.m. y un ligero incremento hasta las 11 a.m. del siguiente día.